home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
basic
/
bwbasic.lha
/
bwbasic
/
bwb_str.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-12
|
7KB
|
306 lines
/***************************************************************
bwb_str.c String-management routines
for Bywater BASIC Interpreter
Copyright (c) 1992, Ted A. Campbell
Bywater Software
P. O. Box 4023
Duke Station
Durham, NC 27706
email: tcamp@acpub.duke.edu
Copyright and Permissions Information:
All U.S. and international copyrights are claimed by the
author. The author grants permission to use this code
and software based on it under the following conditions:
(a) in general, the code and software based upon it may be
used by individuals and by non-profit organizations; (b) it
may also be utilized by governmental agencies in any country,
with the exception of military agencies; (c) the code and/or
software based upon it may not be sold for a profit without
an explicit and specific permission from the author, except
that a minimal fee may be charged for media on which it is
copied, and for copying and handling; (d) the code must be
distributed in the form in which it has been released by the
author; and (e) the code and software based upon it may not
be used for illegal activities.
***************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bwbasic.h"
#include "bwb_mes.h"
#define FREE_STRBUFFERS 0 /* works with QuickC but not others */
#if INTENSIVE_DEBUG || TEST_BSTRING
static char tbuf[ MAXSTRINGSIZE + 1 ];
#endif
/***************************************************************
FUNCTION: str_btob()
DESCRIPTION: This C function assigns a bwBASIC string
structure to another bwBASIC string
structure.
***************************************************************/
int
str_btob( bstring *d, bstring *s )
{
char *t;
register int i;
#if TEST_BSTRING
sprintf( tbuf, "in str_btob(): entry, source b string name is <%s>", s->name );
bwb_debug( tbuf );
sprintf( tbuf, "in str_btob(): entry, destination b string name is <%s>", d->name );
bwb_debug( tbuf );
#endif
/* get memory for new buffer */
if ( ( t = (char *) calloc( s->length + 1, 1 )) == NULL )
{
bwb_error( err_getmem );
return FALSE;
}
/* write the c string to the b string */
t[ 0 ] = '\0';
for ( i = 0; i < s->length; ++i )
{
t[ i ] = s->buffer[ i ];
#if INTENSIVE_DEBUG
tbuf[ i ] = s->buffer[ i ];
tbuf[ i + 1 ] = '\0';
#endif
}
/* deallocate old memory */
#if INTENSIVE_DEBUG
if ( d->rab == TRUE )
{
sprintf( bwb_ebuf, "in str_btob(): reallocating RAB" );
bwb_debug( bwb_ebuf );
}
#endif
#if FREE_STRBUFFERS
if (( d->rab != TRUE ) && ( d->buffer != NULL ))
{
free( d->buffer );
}
#endif
d->rab = (char) FALSE;
/* reassign buffer */
d->buffer = t;
/* reassign length */
d->length = s->length;
#if INTENSIVE_DEBUG
sprintf( bwb_ebuf, "in str_btob(): exit length <%d> string <%s>",
d->length, tbuf );
bwb_debug( bwb_ebuf );
#endif
/* return */
return TRUE;
}
/***************************************************************
FUNCTION: str_ctob()
DESCRIPTION: This C function assigns a null-terminated
C string to a bwBASIC string structure.
***************************************************************/
int
str_ctob( bstring *s, char *buffer )
{
char *t;
register int i;
#if INTENSIVE_DEBUG
sprintf( tbuf, "in str_ctob(): entry, c string is <%s>", buffer );
bwb_debug( tbuf );
#endif
#if TEST_BSTRING
sprintf( tbuf, "in str_ctob(): entry, b string name is <%s>", s->name );
bwb_debug( tbuf );
#endif
/* get memory for new buffer */
if ( ( t = (char *) calloc( strlen( buffer ) + 1, 1 )) == NULL )
{
bwb_error( err_getmem );
return FALSE;
}
/* write the c string to the b string */
t[ 0 ] = '\0';
for ( i = 0; i < strlen( buffer ); ++i )
{
t[ i ] = buffer[ i ];
#if INTENSIVE_DEBUG
tbuf[ i ] = buffer[ i ];
tbuf[ i + 1 ] = '\0';
#endif
}
/* deallocate old memory */
#if INTENSIVE_DEBUG
if ( s->rab == TRUE )
{
sprintf( bwb_ebuf, "in str_ctob(): reallocating RAB" );
bwb_debug( bwb_ebuf );
}
#endif
#if FREE_STRBUFFERS
if (( s->rab != TRUE ) && ( s->buffer != NULL ))
{
free( s->buffer );
}
#endif
s->rab = (char) FALSE;
/* reassign buffer */
s->buffer = t;
/* reassign length */
s->length = (unsigned char) strlen( buffer );
#if INTENSIVE_DEBUG
sprintf( bwb_ebuf, "in str_ctob(): exit length <%d> string <%s>",
s->length, tbuf );
bwb_debug( bwb_ebuf );
#endif
/* return */
return TRUE;
}
/***************************************************************
FUNCTION: str_btoc()
DESCRIPTION: This C function assigns a null-terminated
C string to a bwBASIC string structure.
***************************************************************/
int
str_btoc( char *buffer, bstring *s )
{
register int i;
#if INTENSIVE_DEBUG
sprintf( tbuf, "in str_btoc(): entry, b string length is <%d>",
s->length );
bwb_debug( tbuf );
#endif
#if TEST_BSTRING
sprintf( tbuf, "in str_btoc(): entry, b string name is <%s>", s->name );
bwb_debug( tbuf );
#endif
/* write the b string to the c string */
buffer[ 0 ] = '\0';
for ( i = 0; i < s->length; ++i )
{
buffer[ i ] = s->buffer[ i ];
buffer[ i + 1 ] = '\0';
if ( i >= MAXSTRINGSIZE )
{
i = s->length + 1;
}
}
#if INTENSIVE_DEBUG
sprintf( tbuf, "in str_btoc(): exit, c string is <%s>", buffer );
bwb_debug( tbuf );
#endif
/* return */
return TRUE;
}
/***************************************************************
FUNCTION: str_cat()
DESCRIPTION: This C function
***************************************************************/
char *
str_cat( bstring *a, bstring *b )
{
char abuf[ MAXSTRINGSIZE + 1 ];
char bbuf[ MAXSTRINGSIZE + 1 ];
char *r;
str_btoc( abuf, a );
str_btoc( bbuf, b );
#if INTENSIVE_DEBUG
sprintf( bwb_ebuf, "in str_cat(): a <%s> b <%s>", abuf, bbuf );
bwb_debug( bwb_ebuf );
#endif
r = strcat( abuf, bbuf );
str_ctob( a, abuf );
return r;
}
/***************************************************************
FUNCTION: str_cmp()
DESCRIPTION: This C function
***************************************************************/
int
str_cmp( bstring *a, bstring *b )
{
char abuf[ MAXSTRINGSIZE + 1 ];
char bbuf[ MAXSTRINGSIZE + 1 ];
str_btoc( abuf, a );
str_btoc( bbuf, b );
return strcmp( abuf, bbuf );
}